分享人:甘乐乐
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
索引(INDEX)是寻找资源中特定项目的一种机制,其实质是一种以特定顺序保存的表。索引的作用是便捷化检索表中的行和列的子集,而不需要检查表中的每行。常见有INDEX、UNIQUE INDEX、FULLTXET INDEX和SPATIAL INDEX(仅MyISAM支持后两者)。
UNIQUE INDEX具备INDEX的全部特点,还作为一种机制限制索引列出现重复值,即设置为UNIQUE INDEX的列或者字段,其对应的值必须唯一。唯一索引可以保证数据记录的唯一性。
通常,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。即向表中插入一条记录,DBMS首先检查该记录中被定义为UNIQUE INDEX字段的值是否已经存在;如果是,DBMS将拒绝插入那条新记录。
每个索引实质上是一个表,需要占用磁盘空间与维护管理。每次对表增或删,表中的所有INDEX必须被修改;更新行时,受影响的的列的任何INDEX也必须被修改。一旦发生较多INDEX更改,服务器的处理性能将被拖累。
INDEX默认使用策略(一)
确保所有主键列被索引;
INDEX默认使用策略(二)
为所有被外键约束引用的列创建索引;
INDEX默认使用策略(三)
索引被频繁检索的列。
1)创建索引
mysql> ALTER TABLE Registration
-> ADD INDEX reg_name_idx(name);
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
2)创建唯一索引
mysql> CREATE INDEX reg_name_idx
-> ON Registration (name);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
从MySQL5.0开始,create index命令已经映射到alter table命令,但是前者依旧可用。
3)删除索引
mysql> ALTER TABLE Registration
-> DROP INDEX reg_QQ_idx;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
4)插入一条记录
mysql> INSERT INTO Registration(QQ)
-> VALUES('505034172');
Query OK, 0 rows affected (0.02 sec)
ERROR 1062 (23000): Duplicate entry '505034172' for key
reg_QQ_idx'
表Registration中已经存在VALUE(QQ)='505034172'的记录,插入操作被拒绝。
5)查看索引
mysql> SHOW INDEX FROM Registration \G
在实施主键约束(primary key)、外键约束(foreign key)和唯一约束(unique key)时,MySQL自动生成新索引;而SQL Sever和Oracle处理机制则不同。
基于报名帖的学员表,如果对QQ建立了UNIQUE INDEX,在插入新的学员记录时候,是否需要先判断这个QQ是否存在?
Alan Beaulieu . SQL 学习指南(第2版).张伟超 林青松译.北京:人民邮电出版社,2015.
今天的分享就到这里啦,欢迎大家拍砖和吐槽!
首先感谢我的辅导师兄 王玉琛和刘家铭在学习DBMS过程中对我给予指导和释疑,其次感谢大家观看。